package com.invernadero.invernaderotesis.Acceso_a_datos.DAOS;


import android.annotation.TargetApi;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.os.Build;

import com.invernadero.invernaderotesis.Acceso_a_datos.FabricaDAO.*;
import com.invernadero.invernaderotesis.Acceso_a_datos.iDAOS.*;
import com.invernadero.invernaderotesis.Modelo.Elementos.*;
import com.invernadero.invernaderotesis.Modelo.Entidades.Ambiente.*;
import com.invernadero.invernaderotesis.Modelo.Fabricas.*;



public class DAOTemperatura extends DAO implements iDAOTemperatura{

	/*
	 * Constructores
	 */
	public DAOTemperatura(Context context){
		super();
		
		this.setContext(context);
	}
	
	/**
	 * Insertamos la temperatura de un determinado invernadero en BD
	 * @param temperatura
	 * @param idinvernadero
	 * @return
	 */
	@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
    public Boolean InsertarTemperatura(Temperatura temperatura, int idinvernadero){
		
		Boolean result = false;
		// si un registro no se ha insertado, retorna -1
		Long idInsertado = (long) -1;
		int idVariable = 0; // Cantidad de registros actualizados

		SQLiteDatabase bd = FabricaDAO.CrearSQLiteDatabase(getContext());
		
		try{
			// Crea una instancia de tipo "ContentValues" que representa un registro de la BD
			// y es al que se de deben asignar los valores a insertar
			ContentValues registro = CrearRegistroTemperatura(temperatura);
						
			// Inserta el registro
			idInsertado = bd.insert("Variable", null, registro);
			result      = (idInsertado != (long) -1);
			
			if (result){
				// Armamos el "Query" para extraer el ultimo id insertado
				String sql = this.ObtenerUltimoIdInsertado();
				sql        = this.ObtenerConsultaIdVariable(sql, -1);
				
				// Ejecuta la consulta y re recibe en una variable de tipo "Cursor" para recorrer los resultados
				Cursor fila = bd.rawQuery(sql, null);
				// fila.moveToFirst(): retorna true (1) en caso que exista al menos un registro
				// retorna false (0) si no existen registros
				// Muestra el resultado de la consulta
				if (fila.moveToFirst())
				{
					// Extraemos el id insertado de la tabla "variable"
					idVariable = fila.getInt(0);
					// creamos un ContentValues con los IDS del invernadero y variable
					registro = CrearRegistroIDSInvernaderoVariable(idinvernadero,idVariable);
					// hacemos una insercion en la tabla "VariableInver"
					idInsertado = bd.insert("VariableInver", null, registro);
					result = (idInsertado != (long) -1);
									
				}
				
				// verificamos que haya insertado de forma correcta en la tabla "VariableInver"
				if (result){
					// creamos un ContentValues con la informacion a insertar en la tabla "Timer"
					registro = this.CrearRegistroTimer(temperatura, idinvernadero);
					// insertamos el registro en la tabla "Timer"
					idInsertado = bd.insert("Timer", null, registro);
					result      = (idInsertado != (long) -1);
				}
			}
			
		}catch(SQLiteException e){
			
			  throw new SQLiteException("error al insertar el registro");
			  
		}finally{
			
			bd.close();
			//EliminarTemperatura(idinvernadero);
		}
		
		return true;
	}
	
	public void EliminarTemperatura(int idinvernadero) {
		
		Boolean result = false;

		// si un registro no se ha insertado, retorna -1
		//Long idInsertado = (long) -1;
		int cant = 0; // Cantidad de registros actualizados

		// Accede a la BD y le pone por nombre "BdTerrae"
		SQLiteDatabase bd = FabricaDAO.CrearSQLiteDatabase(getContext());

		try
		{
			cant = bd.delete("Variable", null, null);
			cant = bd.delete("VariableInver", null, null);
			cant = bd.delete("Timer", null, null);
			result = (cant > 0);
		} catch (Exception e)
		{
			result = false;
			// 
		}
		finally
		{
			bd.close();
		}
		
		
	}
	/**
	 * Creamos un ContentValues para insertar en los campos de variables de la tabla VariableInver
	 * 
	 * @param idInvernadero
	 * @param idVariable
	 * @return
	 */
	private ContentValues CrearRegistroIDSInvernaderoVariable(int idInvernadero, int idVariable){
		// Crea una instancia de tipo "ContentValues" que representa un registro de la BD
		// y es al que se de deben asignar los valores a insertar
		ContentValues registro = new ContentValues();
		
		registro.put("fkInvernadero", idInvernadero);
		registro.put("fkVariable", idVariable);
		
		return registro;
	}
	
	/**
	 * Creamos un ContentValues para insertar en los campos de variables
	 * @param temperatura
	 * @return
	 */
	private ContentValues CrearRegistroTemperatura(Temperatura temperatura)
	{
		// Crea una instancia de tipo "ContentValues" que representa un registro de la BD
		// y es al que se de deben asignar los valores a insertar
		ContentValues registro = new ContentValues();
		
		Conversion conversion = FabricaElemento.CrearConversion();
		
		registro.put("nombre", temperatura.get_nombre());
		registro.put("fecha", conversion.ConvertirFecha(temperatura.getFecha()));
		registro.put("medicion", temperatura.getMedicion());
		
		return registro;
	}
	
	
}
